<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/Python-3.6.2/Include/weakrefobject.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/Python-3.6.2/Include/weakrefobject.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="True">       1:</span> <span class="k">/* Weak references objects for Python. */</span>
<a name="2" /><span class="True">       2:</span> 
<a name="3" /><span class="True">       3:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="macros_noref.html#_UHlfV0VBS1JFRk9CSkVDVF9IXzA_"><span class="b">Py_WEAKREFOBJECT_H</span></a>
<a name="4" /><span class="True">       4:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_UHlfV0VBS1JFRk9CSkVDVF9IXzA_"><span class="b">Py_WEAKREFOBJECT_H</span></a>
<a name="5" /><span class="False">       5:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">__cplusplus</span>
<a name="6" /><span class="False">       6:</span> <span class="m">extern</span> <span class="e">&quot;C&quot;</span> <span class="f">{</span>
<a name="7" /><span class="True">       7:</span> <span class="f">#</span><span class="n">endif</span>
<a name="8" /><span class="True">       8:</span> 
<a name="9" /><span class="True">       9:</span> 
<a name="10" /><span class="True">      10:</span> <span class="m">typedef</span> <span class="m">struct</span> <span class="b">_PyWeakReference</span> <span class="b">PyWeakReference</span><span class="f">;</span>
<a name="11" /><span class="True">      11:</span> 
<a name="12" /><span class="True">      12:</span> <span class="k">/* PyWeakReference is the base struct for the Python ReferenceType, ProxyType,</span>
<a name="13" /><span class="True">      13:</span> <span class="k"> * and CallableProxyType.</span>
<a name="14" /><span class="True">      14:</span> <span class="k"> */</span>
<a name="15" /><span class="True">      15:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">Py_LIMITED_API</span>
<a name="16" /><span class="True">      16:</span> <span class="m">struct</span> <span class="b">_PyWeakReference</span> <span class="f">{</span>
<a name="17" /><span class="True">      17:</span>     <a href="macros_ref.html#_UHlPYmplY3RfSEVBRF8w"><span class="b">PyObject_HEAD</span></a>
<a name="18" /><span class="True">      18:</span> 
<a name="19" /><span class="True">      19:</span>     <span class="k">/* The object to which this is a weak reference, or Py_None if none.</span>
<a name="20" /><span class="True">      20:</span> <span class="k">     * Note that this is a stealth reference:  wr_object&apos;s refcount is</span>
<a name="21" /><span class="True">      21:</span> <span class="k">     * not incremented to reflect this pointer.</span>
<a name="22" /><span class="True">      22:</span> <span class="k">     */</span>
<a name="23" /><span class="True">      23:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">wr_object</span><span class="f">;</span>
<a name="24" /><span class="True">      24:</span> 
<a name="25" /><span class="True">      25:</span>     <span class="k">/* A callable to invoke when wr_object dies, or NULL if none. */</span>
<a name="26" /><span class="True">      26:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">wr_callback</span><span class="f">;</span>
<a name="27" /><span class="True">      27:</span> 
<a name="28" /><span class="True">      28:</span>     <span class="k">/* A cache for wr_object&apos;s hash code.  As usual for hashes, this is -1</span>
<a name="29" /><span class="True">      29:</span> <span class="k">     * if the hash code isn&apos;t known yet.</span>
<a name="30" /><span class="True">      30:</span> <span class="k">     */</span>
<a name="31" /><span class="True">      31:</span>     <span class="b">Py_hash_t</span> <span class="b">hash</span><span class="f">;</span>
<a name="32" /><span class="True">      32:</span> 
<a name="33" /><span class="True">      33:</span>     <span class="k">/* If wr_object is weakly referenced, wr_object has a doubly-linked NULL-</span>
<a name="34" /><span class="True">      34:</span> <span class="k">     * terminated list of weak references to it.  These are the list pointers.</span>
<a name="35" /><span class="True">      35:</span> <span class="k">     * If wr_object goes away, wr_object is set to Py_None, and these pointers</span>
<a name="36" /><span class="True">      36:</span> <span class="k">     * have no meaning then.</span>
<a name="37" /><span class="True">      37:</span> <span class="k">     */</span>
<a name="38" /><span class="True">      38:</span>     <span class="b">PyWeakReference</span> <span class="f">*</span><span class="b">wr_prev</span><span class="f">;</span>
<a name="39" /><span class="True">      39:</span>     <span class="b">PyWeakReference</span> <span class="f">*</span><span class="b">wr_next</span><span class="f">;</span>
<a name="40" /><span class="True">      40:</span> <span class="f">}</span><span class="f">;</span>
<a name="41" /><span class="True">      41:</span> <span class="f">#</span><span class="n">endif</span>
<a name="42" /><span class="True">      42:</span> 
<a name="43" /><span class="True">      43:</span> <a href="macros_ref.html#_UHlBUElfREFUQV8w"><span class="b">PyAPI_DATA</span></a><span class="f">(</span><span class="b">PyTypeObject</span><span class="f">)</span> <span class="b">_PyWeakref_RefType</span><span class="f">;</span>
<a name="44" /><span class="True">      44:</span> <a href="macros_ref.html#_UHlBUElfREFUQV8w"><span class="b">PyAPI_DATA</span></a><span class="f">(</span><span class="b">PyTypeObject</span><span class="f">)</span> <span class="b">_PyWeakref_ProxyType</span><span class="f">;</span>
<a name="45" /><span class="True">      45:</span> <a href="macros_ref.html#_UHlBUElfREFUQV8w"><span class="b">PyAPI_DATA</span></a><span class="f">(</span><span class="b">PyTypeObject</span><span class="f">)</span> <span class="b">_PyWeakref_CallableProxyType</span><span class="f">;</span>
<a name="46" /><span class="True">      46:</span> 
<a name="47" /><span class="True">      47:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_UHlXZWFrcmVmX0NoZWNrUmVmXzA_"><span class="b">PyWeakref_CheckRef</span></a><span class="f">(</span><span class="b">op</span><span class="f">)</span> <a href="macros_ref.html#_UHlPYmplY3RfVHlwZUNoZWNrXzA_"><span class="b">PyObject_TypeCheck</span></a><span class="f">(</span><span class="b">op</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">_PyWeakref_RefType</span><span class="f">)</span>
<a name="48" /><span class="True">      48:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_UHlXZWFrcmVmX0NoZWNrUmVmRXhhY3RfMA__"><span class="b">PyWeakref_CheckRefExact</span></a><span class="f">(</span><span class="b">op</span><span class="f">)</span> \
<a name="49" /><span class="True">      49:</span>         <span class="f">(</span><a href="macros_ref.html#_UHlfVFlQRV8w"><span class="b">Py_TYPE</span></a><span class="f">(</span><span class="b">op</span><span class="f">)</span> <span class="f">==</span> <span class="f">&amp;</span><span class="b">_PyWeakref_RefType</span><span class="f">)</span>
<a name="50" /><span class="True">      50:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_UHlXZWFrcmVmX0NoZWNrUHJveHlfMA__"><span class="b">PyWeakref_CheckProxy</span></a><span class="f">(</span><span class="b">op</span><span class="f">)</span> \
<a name="51" /><span class="True">      51:</span>         <span class="f">(</span><span class="f">(</span><a href="macros_ref.html#_UHlfVFlQRV8w"><span class="b">Py_TYPE</span></a><span class="f">(</span><span class="b">op</span><span class="f">)</span> <span class="f">==</span> <span class="f">&amp;</span><span class="b">_PyWeakref_ProxyType</span><span class="f">)</span> <span class="f">||</span> \
<a name="52" /><span class="True">      52:</span>          <span class="f">(</span><a href="macros_ref.html#_UHlfVFlQRV8w"><span class="b">Py_TYPE</span></a><span class="f">(</span><span class="b">op</span><span class="f">)</span> <span class="f">==</span> <span class="f">&amp;</span><span class="b">_PyWeakref_CallableProxyType</span><span class="f">)</span><span class="f">)</span>
<a name="53" /><span class="True">      53:</span> 
<a name="54" /><span class="True">      54:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_UHlXZWFrcmVmX0NoZWNrXzA_"><span class="b">PyWeakref_Check</span></a><span class="f">(</span><span class="b">op</span><span class="f">)</span> \
<a name="55" /><span class="True">      55:</span>         <span class="f">(</span><a href="macros_noref.html#_UHlXZWFrcmVmX0NoZWNrUmVmXzA_"><span class="b">PyWeakref_CheckRef</span></a><span class="f">(</span><span class="b">op</span><span class="f">)</span> <span class="f">||</span> <a href="macros_noref.html#_UHlXZWFrcmVmX0NoZWNrUHJveHlfMA__"><span class="b">PyWeakref_CheckProxy</span></a><span class="f">(</span><span class="b">op</span><span class="f">)</span><span class="f">)</span>
<a name="56" /><span class="True">      56:</span> 
<a name="57" /><span class="True">      57:</span> 
<a name="58" /><span class="True">      58:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span> <span class="b">PyWeakref_NewRef</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="b">ob</span><span class="f">,</span>
<a name="59" /><span class="True">      59:</span>                                               <span class="b">PyObject</span> <span class="f">*</span><span class="b">callback</span><span class="f">)</span><span class="f">;</span>
<a name="60" /><span class="True">      60:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span> <span class="b">PyWeakref_NewProxy</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="b">ob</span><span class="f">,</span>
<a name="61" /><span class="True">      61:</span>                                                 <span class="b">PyObject</span> <span class="f">*</span><span class="b">callback</span><span class="f">)</span><span class="f">;</span>
<a name="62" /><span class="True">      62:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span> <span class="b">PyWeakref_GetObject</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="b">ref</span><span class="f">)</span><span class="f">;</span>
<a name="63" /><span class="True">      63:</span> 
<a name="64" /><span class="True">      64:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">Py_LIMITED_API</span>
<a name="65" /><span class="True">      65:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">Py_ssize_t</span><span class="f">)</span> <span class="b">_PyWeakref_GetWeakrefCount</span><span class="f">(</span><span class="b">PyWeakReference</span> <span class="f">*</span><span class="b">head</span><span class="f">)</span><span class="f">;</span>
<a name="66" /><span class="True">      66:</span> 
<a name="67" /><span class="True">      67:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">void</span><span class="f">)</span> <span class="b">_PyWeakref_ClearRef</span><span class="f">(</span><span class="b">PyWeakReference</span> <span class="f">*</span><span class="b">self</span><span class="f">)</span><span class="f">;</span>
<a name="68" /><span class="True">      68:</span> <span class="f">#</span><span class="n">endif</span>
<a name="69" /><span class="True">      69:</span> 
<a name="70" /><span class="True">      70:</span> <span class="k">/* Explanation for the Py_REFCNT() check: when a weakref&apos;s target is part</span>
<a name="71" /><span class="True">      71:</span> <span class="k">   of a long chain of deallocations which triggers the trashcan mechanism,</span>
<a name="72" /><span class="True">      72:</span> <span class="k">   clearing the weakrefs can be delayed long after the target&apos;s refcount</span>
<a name="73" /><span class="True">      73:</span> <span class="k">   has dropped to zero.  In the meantime, code accessing the weakref will</span>
<a name="74" /><span class="True">      74:</span> <span class="k">   be able to &quot;see&quot; the target object even though it is supposed to be</span>
<a name="75" /><span class="True">      75:</span> <span class="k">   unreachable.  See issue #16602. */</span>
<a name="76" /><span class="True">      76:</span> 
<a name="77" /><span class="True">      77:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_UHlXZWFrcmVmX0dFVF9PQkpFQ1RfMA__"><span class="b">PyWeakref_GET_OBJECT</span></a><span class="f">(</span><span class="b">ref</span><span class="f">)</span>                           \
<a name="78" /><span class="True">      78:</span>     <span class="f">(</span><a href="macros_ref.html#_UHlfUkVGQ05UXzA_"><span class="b">Py_REFCNT</span></a><span class="f">(</span><span class="f">(</span><span class="f">(</span><span class="b">PyWeakReference</span> <span class="f">*</span><span class="f">)</span><span class="f">(</span><span class="b">ref</span><span class="f">)</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">wr_object</span><span class="f">)</span> <span class="f">&gt;</span> <span class="c">0</span>   \
<a name="79" /><span class="True">      79:</span>      <span class="f">?</span> <span class="f">(</span><span class="f">(</span><span class="b">PyWeakReference</span> <span class="f">*</span><span class="f">)</span><span class="f">(</span><span class="b">ref</span><span class="f">)</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">wr_object</span>                \
<a name="80" /><span class="True">      80:</span>      <span class="f">:</span> <a href="macros_ref.html#_UHlfTm9uZV8w"><span class="b">Py_None</span></a><span class="f">)</span>
<a name="81" /><span class="True">      81:</span> 
<a name="82" /><span class="True">      82:</span> 
<a name="83" /><span class="False">      83:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">__cplusplus</span>
<a name="84" /><span class="False">      84:</span> <span class="f">}</span>
<a name="85" /><span class="True">      85:</span> <span class="f">#</span><span class="n">endif</span>
<a name="86" /><span class="True">      86:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* !Py_WEAKREFOBJECT_H */</span>
<a name="87" /><span class="True">      87:</span> </pre>
  </body>
</html>
